import { post, upload } from '@/api';
import { useUser, useOrder } from '@/store';
import Decimal from './decimal.mjs';
import { url } from '@/uni_modules/uv-ui-tools/libs/function/test.js';
import { judgeIosPermission, requestAndroidPermission } from "@/common/permission.js"
/**
 * 加载中窗口
 */
function loading(msg='加载中', mask=false){
  uni.showLoading({
  	title: msg,
    mask: mask
  });
}
/**
 * 轻弹窗
 */
function toast(msg, mask, time){
  uni.showToast({
    title: msg,
    icon:'none',
    mask: mask || false,
    duration: time || 1000
  })
}
/**
 * deepArr 数组克隆
 * @description 数组克隆
 * @property {Array} value 数组
 */
function deepArr(value){
  let arr = [];
  value.forEach(e => {
    arr.push(e);
  })
  return arr;
}
/**
 * 图片文件URL拉接
 */
function setUrl(file){
  if(file){
    if(isBase64(file)) return '/static/logo.png';
    if(url(file)) return file;
    return useUser().imgUrl + file;
  }else{
    return '/static/logo.png';
  }
}
function isBase64(str) {
  if (str ==='' || str.trim() ===''){ return false; }
  const index = str.indexOf('data:image/');
  if(index >= 0) return true;
  return false;
}
/**
 * 验证手机格式
 */
function mobile(value) {
    return /^1([3589]\d|4[5-9]|6[1-2,4-7]|7[0-8])\d{8}$/.test(value)
}
/**
 * add 精度加法
 * @description 此方法可将两个数进行高精度计算加法
 * @property {Array} x 第一个要相加的数字
 * @property {Object} y 第二个要相加的数字
 */
function add (x, y) {
  if (!x) {
    x = 0
  }
  if (!y) {
    y = 0
  }
  const xx = new Decimal(x)
  const yy = new Decimal(y)
  return xx.plus(yy).toNumber()
}
/**
 * add 精度减法
 * @description 此方法可将两个数进行高精度计算减法
 * @property {Array} x 第一个要相减的数字
 * @property {Object} y 第二个要相减的数字
 */
function reduce (x, y) {
  if (!x) {
    x = 0
  }
  if (!y) {
    y = 0
  }
  const xx = new Decimal(x)
  const yy = new Decimal(y)
  return xx.minus(yy).toNumber()
}
/**
 * division 精度乘法
 * @description 此方法可将两个数进行高精度计算乘法
 * @property {Array} x 第一个要相乘的数字
 * @property {Object} y 第二个要相乘的数字
 */
function mul (x, y) {
  if (!x) {
    x = 0
  }
  if (!y) {
    y = 0
  }
  const xx = new Decimal(x)
  const yy = new Decimal(y)
  return xx.mul(yy).toNumber()
}
/**
 * division 精度除法
 * @description 此方法可将两个数进行高精度计算除法
 * @property {Array} x 第一个要相除的数字
 * @property {Object} y 第二个要相除的数字
 */
function division (x, y) {
  if (!x) {
    x = 0
  }
  if (!y) {
    y = 0
  }
  const xx = new Decimal(x)
  const yy = new Decimal(y)
  return xx.div(yy).toNumber()
}
/**
 * thous 数字处理
 * @description 数字超过千位，显示xk，如1000，则显示1k
 * @property {Array} num 要处理的数字
 */
function thous(num){
  if (num < 1000) {
    return num.toFixed(0);   // assuming an integer
  } else {
    const s = (0.1 * Math.floor(num / 100)).toFixed(1);
    return s.replace('.0', '') + 'k';
  }
}
/**
 * getDates 计算两个日期之间的天数
 * @description 计算两个日期之间的天数
 * @property {String} date1 第一个日期
 * @property {String} date2 第二个日期
 */
function getDates(date1, date2) {
  const startDate = new Date(date1);
  const endDate = new Date(date2);

  // 计算两个日期的时间差
  const timeDifference = endDate.getTime() - startDate.getTime();

  // 将时间差转换为天数
  const daysDifference = Math.floor(timeDifference / (1000 * 3600 * 24));

  return daysDifference;
}
/**
 * suffixFile 截取文件名
 * @property {String} url 文件的地址链接 
*/
function suffixFile(file){
  var lastOf = file.lastIndexOf('/')
  return file.substr(lastOf + 1)
}
/**
 * 获取用户信息
 */
function getUser(){
  return new Promise((resolve, reject) => {
    post('api/user/getUserInfo').then(res => {
      if(res.code == 1){
        const data = res.data;
        uni.setStorageSync('token', data.token);
        uni.setStorageSync('userInfo', data);
        useUser().setToken(data.token);
        useUser().setUserInfo(data);
        resolve(data);
      }
    })
  })
}
/**
 * 通用查询服务的函数
 * @description 此方法主要用户上传图片使用
 * @property {String} service 服务商类型，如：oauth，share，payment
 * @property {String} provider 要检查的服务标识，如weixin，qq，sinaweibo等
 */
function checkServe(service, provider, action){
  uni.getProvider({
  	service: service,
  	success: function (res) {
  		const obj = res.providers.find(o => o.id == provider);
      if(obj.isAppExist){
        action();
      }else{
        toast('请安装' + obj.description);
      }
  	}
  });
}
/**
 * 通用的授权检查函数（APP端弃用，当时没注意getSetting不兼容app端）
 */
function checkAuth(scope, action){
  // 检查权限授权状态
  uni.getSetting({
    success: (res) => {
      if (res.authSetting[scope]) {
        // 已授权，执行指定的功能
        action();
      } else {
        // 未授权，发起授权请求
        requestAuthorization(scope, action);
      }
    },
    fail: (error) => {
      console.error('获取用户授权信息失败', error);
    },
  });
}
// 请求权限授权
function requestAuthorization(scope, action) {
  uni.authorize({
    scope: scope,
    success: () => {
      // 用户同意授权，执行指定的功能
      action();
    },
    fail: (error) => {
      // 用户拒绝授权，引导用户打开设置页面
      openSetting(scope, action);
    },
  });
}
// 打开设置页面
function openSetting(scope, action) {
  uni.showModal({
    title: '提示',
    content: `需要您授权使用${scope}，是否打开设置页面？`,
    success: (res) => {
      if (res.confirm) {
        uni.openSetting({
          success: (settingRes) => {
            // 用户在设置页面授权后，重新检查权限授权状态
            if (settingRes.authSetting[scope]) {
              // 用户已授权，执行指定的功能
              action();
            } else {
              // 用户仍未授权，提示授权失败
              uni.showToast({
                title: `授权失败，请在设置中开启${scope}权限`,
                icon: 'none',
              });
            }
          },
          fail: (settingError) => {
            console.error('打开设置页面失败', settingError);
          },
        });
      }
    },
  });
}
/**
 * formatTimeData 传一个日期，返回此日期是今天，明天，后天还是以后的日期
 * @property {string} data 传一个日期时间
 * @property {bool} timeShow 是否返回时间，默认返回
 * 
*/
function formatTimeData(data, timeShow = true) {
  let result = '';
  if(uni.$uv.os() == 'ios'){
    data = data.replace(' ', 'T');
  }
  const itemDate = new Date(data);
  const today = new Date();
  const tomorrow = new Date(today);
  tomorrow.setDate(today.getDate() + 1);
  const dayAfterTomorrow = new Date(today);
  dayAfterTomorrow.setDate(today.getDate() + 2);
  if (isSameDay(itemDate, today)) {
    result = `今天${ timeShow ? formatTime(itemDate) : ''}`;
    
  } else if (isSameDay(itemDate, tomorrow)) {
    result = `明天${ timeShow ? formatTime(itemDate) : ''}`;
  } else if (isSameDay(itemDate, dayAfterTomorrow)) {
    result = `后天${ timeShow ? formatTime(itemDate) : ''}`;
  } else {
    result = `${formatMonthDayTime(itemDate, timeShow)}`;
  }

  return result;
}

// 判断两个日期是否是同一天
function isSameDay(date1, date2) {
  return date1.getFullYear() === date2.getFullYear() &&
         date1.getMonth() === date2.getMonth() &&
         date1.getDate() === date2.getDate();
}

// 格式化时间为 时:分
function formatTime(date) {
  const hours = date.getHours().toString().padStart(2, '0');
  const minutes = date.getMinutes().toString().padStart(2, '0');
  return `${hours}:${minutes}`;
}

// 格式化日期为 月-日 时:分
function formatMonthDayTime(date, timeShow) {
  const month = (date.getMonth() + 1).toString().padStart(2, '0');
  const day = date.getDate().toString().padStart(2, '0');
  const time = timeShow ? formatTime(date) : '';
  return `${month}-${day} ${time}`;
}
/**
 * choose 上传图片
 * @description 此方法主要用户上传图片使用
 * @property {Array} sourceType 指定是原图还是压缩图，默认二者都有
 * @property {Object} crop 对象形象，裁剪的宽高，默认{}
 * @property {bool} file 是否返回文件的原始路径
 */
function choose(sourceType=['album', 'camera'], crop={}){
  return new Promise(async (resolve, reject) => {
    uni.chooseImage({
    	count: 1, //默认9
    	sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有
    	sourceType: sourceType, //从相册选择
      crop: crop,
    	success: function (res) {
    		const tempFilePaths = res.tempFilePaths;
        resolve(setUpload(tempFilePaths));
    	}
    });
  })
}
function setUpload(tempFilePaths){
  return new Promise((resolve, reject) => {
    const params = {
      name: 'file',
      filePath: tempFilePaths[0],
    }
    upload('api/common/upload', params).then(res => {
      if(res.code == 1){
        const data = res.data;
        resolve(data.url);
      }
    })
  })
}
/**
 * getBanner 获取banner图
 * @description 获取banner图
 * @property {Object} params 接口需要传的参数
 */
function getBanner(params){
  return new Promise((resolve, reject) => {
    post('api/banner/getBannerList', params).then(res => {
      if(res.code == 1){
        resolve(res.data.data);
      }
    })
  })
}
/**
 * editGroup 修改社群资料
 * @description 此方法主要用在社群管理上调用接口进行修改社群资料
 * @property {Object} params 接口需要传的参数
 */
function editGroup(params){
  return new Promise((resolve, reject) => {
    post('api/association/setAssociation', params).then(res => {
      if(res.code == 1){
        resolve(res);
      }
    })
  })
}
/**
 * getGroup 获取社群详情页信息
 * @description 此方法社群资料详情
 * @property {String || Number} 社群的id
 */
function getGroup(id){
  console.log(id);
  post('api/association/getAssociationDetail', { association_id: id }).then(res => {
    if(res.code == 1){
      const data = res.data;
      useOrder().setGroup(data);
    }
  })
}

/**
 * getAddScore 用户每周分享/阅读-社群/主题/动态获得积分
 * @description 用户每周分享/阅读-社群/主题/动态获得积分
 * @property {Object} 接口的params
 */
function getAddScore(params, msg){
  console.log(params);
  post('api/association/shareAndReadAddScore', params, { custom: {toast: true} }).then(res => {
    console.log(res)
    if(res.code == 1){
      const data = res.data;
      console.log(`${msg} 积分+${data.score}`);
      toast(`${msg} 积分+${data.score}`, false, 2000);
    }
  })
}
export {
  loading,
  toast,
  deepArr,
  setUrl,
  mobile,
  add,
  reduce,
  mul,
  division,
  thous,
  getDates,
  suffixFile,
  getUser,
  checkAuth,
  choose,
  editGroup,
  getGroup,
  setUpload,
  checkServe,
  getAddScore,
  formatTimeData,
  getBanner
}